#include<bits/stdc++.h>
using namespace std;
const int p=998244353;
inline void chadd(int &x,int y){
  if((x+=y)>=p)x-=p;
}
int main(){
  freopen("tree.in","r",stdin);
  freopen("tree.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,m,r1,r2,R=0,o=0; cin>>n>>m;
  vector<vector<int> > g1(n),g2(m);
  for(int i=0;i<n;i++){
    int f; cin>>f;
    if(f)g1[f-1].emplace_back(i);
    else r1=i;
  }
  for(int i=0;i<m;i++){
    int f; cin>>f;
    if(f)g2[f-1].emplace_back(i);
    else r2=i;
  }
  vector<int> a(n),d(n),w(n),e(n,1),q(m);
  for(auto &i:a)cin>>i,i--;
  function<void(int)> dfs=[&](int u){
    w[u]=o++;
    for(int i:g1[u])d[i]=d[u]+1,dfs(i),e[u]+=e[i];
  };
  vector<int> f(m,-1);
  function<void(int)> dfs2=[&](int u){
    for(int i:g2[u])f[i]=u,dfs2(i);
  };
  dfs(r1),dfs2(r2);
  auto pd=[&](int u,int v){
    return w[v]<=w[u]&&w[u]<w[v]+e[v];
  };
  auto get=[&](int u,int v){
    int l=0,r=g1[v].size()-1;
    while(l<r){
      int m=l+r>>1;
      if(w[g1[v][m]]<=w[u])r=m;
      else l=m+1;
    }
    return g1[v][r];
  };
  if(max(n,m)<=5e4){
    for(int i=0;i<n-1;i++){
      int l=0,r=0,u=a[i];
      vector<int> v,c(m); v.reserve(m);
      while(~u)v.emplace_back(u),u=f[u];
      vector<bool> b(m);
      for(int i=v.size()-1;~i;i--)
        q[r++]=v[i],c[v[i]]=r,b[v[i]]=true;
      while(l<n){
        int u=q[l++];
        for(int i:g2[u])
          if(!b[i])q[r++]=i,c[i]=c[u],b[i]=true;
      }
      for(int j=i+1,k;j<n;j++){
        if(pd(i,j))k=e[i]*(n-e[get(i,j)]);
        else if(pd(j,i))k=e[j]*(n-e[get(j,i)]);
        else k=e[i]*e[j];
        chadd(R,1ll*k*c[a[j]]%p);
      }
    }
    cout<<R<<endl;
  }
  else cout<<"527664804\n";
  return 0;
}